package com.sinosoft.brokerchannel.base.utile;
import java.util.ArrayList;
import java.util.List;

import com.sinosoft.brokerchannel.base.common.ChannelConstants;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * 功能：SAX处理类
 * @author shilk
 * @date 2017-11-6 13:57:17
 */
public class SaxHandler extends DefaultHandler {
    
	/** JSON字符串 */
    private StringBuilder jsonStr = new StringBuilder();
    /** 正在解析的元素的名字*/
    private String currentTag=null;
    /**
     * List节点记录
     */
    private List<String> parseNodeList = new ArrayList<>();

    
    String getJsonStr() {
        return jsonStr.toString();
    }

    /**
     * 开始解析文档，即开始解析XML根元素时调用该方法
     */
    @Override
    public void startDocument() throws SAXException {
        jsonStr.append("{");
    }

    /**
     * 开始解析每个元素时都会调用该方法
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
    	
    	//结束节点处理
    	if(parseNodeList.size() > 0) {
			if(parseNodeList.contains(qName)) {
				jsonStr.replace(jsonStr.length()-3, jsonStr.length(), "},");
    		}
    	}
    	
    	nodeBuilder = new StringBuilder();
        if(ChannelConstants.XML_TO_JSON_DATANODE.contains(qName)) {
            //对象节点（若新增对象节点在常量XML_TO_JSON_DATANODE中不存在，需添加配置）
        	jsonStr.append("\"").append(qName).append("\":{");
        }else if(ChannelConstants.XML_TO_JSON_NODE.contains(qName)) {
            //List节点（若新增List节点在常量XML_TO_JSON_NODE中不存在，需添加配置）
        	if(parseNodeList.contains(qName)) {
        		jsonStr.append("{");
        	}else {
        		jsonStr.append("\"").append(qName).append("\":[{");
        		parseNodeList.add(qName);
        	}
        }
        //正在解析的元素
        currentTag=qName;
    }

    /**
     * 解析到每个元素的内容时会调用此方法
     */
    private StringBuilder nodeBuilder;
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
    	nodeBuilder.append(ch, start, length);
    }

    /**
     * 每个元素结束的时候都会调用该方法
     */
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        /* 正在解析的元素的元素值*/
        String currentValue;
    	if(!ChannelConstants.XML_TO_JSON_DATANODE.contains(qName)  && !ChannelConstants.XML_TO_JSON_NODE.contains(qName)) {
    		if(currentTag!=null){
	  	    	  jsonStr.append("\"").append(currentTag).append("\":");
	  	          currentValue = nodeBuilder.toString();
	  	          String enter = "\n";
	  	          String tabEnter = "\n";
	  	          if(!(enter).equals(currentValue.trim())&&!(tabEnter).equals(currentValue.trim())){
	  	        	jsonStr.append("\"").append(currentValue).append("\",");
	  	          }
	  	        
	  	          //当前的元素已解析过，将其置空用于下一个元素的解析
	  	          currentTag=null;
    		}
    	}
	     
    	
    	String comma = ",";
        if(ChannelConstants.XML_TO_JSON_DATANODE.contains(qName)) {
        	if(comma.equals(jsonStr.substring(jsonStr.length()-1, jsonStr.length()))) {
            	jsonStr.replace(jsonStr.length()-1, jsonStr.length(), "");
            }
        	jsonStr.append("},");
        }else if(ChannelConstants.XML_TO_JSON_NODE.contains(qName)) {
        	if(comma.equals(jsonStr.substring(jsonStr.length()-1, jsonStr.length()))) {
            	jsonStr.replace(jsonStr.length()-1, jsonStr.length(), "");
            }
        	jsonStr.append("}],");
        }
    }

    /**
     * 结束解析文档，即解析根元素结束标签时调用该方法
     */
    @Override
    public void endDocument() throws SAXException {
        jsonStr.replace(jsonStr.length()-1, jsonStr.length(), "}");
        parseNodeList = new ArrayList<>();
        super.endDocument();
    }
}
